import {
  useTips
} from '@/hooks/useTips'
import {
  deepClone,
  isEmpty,
  getOtherQuery,
} from '@/util/common';
import {clearAccessToken, clearLoginInfo, setAccessToken, setUserInfo} from '@/util/storage/userStorage'
import { getAsyncCode } from '@/util/thirdParty/core/dingding';
const {
  showDialog,
  showLoading,
  showLoaded,
} = useTips()
/**
 * 导入登录相关API
 * 1. loginByCode：通过验证码方式登录。
 * 2. loginByToken：通过令牌方式登录。
 */
import { loginByCode, loginByToken } from '@/apis/login';
import {responseError, responseSuccess} from "@/util/response";

/**
 * 初始化加载过程，用于登录验证和信息初始化。
 * @param {Function} options.success 登录成功时的回调函数。
 * @param {Function} options.error 登录失败时的回调函数。
 * @returns {Promise} 返回一个Promise对象，成功时resolve调用success回调，失败时reject调用error回调。
 */
export const initLoad = async ({
  success,
  error
}) => {
  try {
    clearUserInfo()
    let res = await goLogin()
    console.log('initLoad res', res)
    if (!res.success) {
      if (res.code != 72000) {
        showErrMessage(res.msg || '')
      }
      return error(res)
    }
    return success(res)
  } catch (e) {
    console.log('initLoad err', e)
    return error(responseError())
  }
}
/**
 * 执行登录逻辑，根据是否有token选择登录方式。
 * @returns {Promise} 登录过程的Promise对象。
 */
const goLogin = async () => {
  const route = useRoute()
  const currentQuery = route.query
  const otherQuery = getOtherQuery()
  console.log('goLogin otherQuery', otherQuery)
  console.log('goLogin currentQuery', currentQuery)
  if (isEmpty(currentQuery.token) && isEmpty(otherQuery.token)) {
    //走 dingding code 登录
    return await codeLogin()
  }
  // 走 token 登录
  let token = currentQuery.token
  if (isEmpty(token)) {
    token = otherQuery.token
  }
  return await tokenLogin(token)
}

/**
 * 钉钉免登code登录流程。
 */
const codeLogin = async () => {
  console.log('codeLogin', 1)
  let res = {}
  try{
    res = await getAsyncCode()
  }catch(e){
    return responseError('异常错误 - 573')
  }
  if (!res.success) {
    return res
  }
  const code = res?.data
  if (isEmpty(code)) {
    return responseError('code为空', 72000)
  }
  return await goLoginByCode(code)
}
/**
 * 使用code进行登录。
 * @param {string} code 钉钉授权的code。
 * @returns {Promise} 登录结果的Promise对象。
 */
const goLoginByCode = async (code) => {
  let res = {}
  showLoading()
  try {
    res = await loginByCode({
      code
    })
  } catch (err) {
    showLoaded()
    console.log('login -> err', err)
    return handleErrorData(err)
  }
  console.log('login -> res', res)
  showLoaded()
  if (!res.success) {
    return responseError(res.message)
  }
  const result = res.result || {}
  console.log('result', result)
  saveUserInfo(result)
  return responseSuccess()
}

/**
 * 通过token进行登录。
 * @param {string} token 用户的访问token。
 * @returns {Promise} 登录结果的Promise对象。
 */
const tokenLogin = async (token) => {
  let res = {}
  console.log('加载内容', token)
  setAccessToken(token)
  showLoading()
  try {
    res = await loginByToken({
      token
    })
  } catch (err) {
    showLoaded()
    console.log('loginByToken err', err)
    return handleErrorData(err)
  }
  showLoaded()
  if (!res.success) {
    return responseError(res.message)
  }
  console.log('res', res)
  const result = res.result || {}
  console.log('result', result)
  saveUserInfo(result)
  return responseSuccess()
}
export const handleErrorData = (err) => {
  console.log('handleError', err)
  const {myNativeResponseData} = err || {}
  if (isEmpty(myNativeResponseData)) {
    return responseError()
  }
  if (myNativeResponseData.code === 401) {
    return responseError('登录失效', 401)
  }
  return responseError(myNativeResponseData?.msg || '')
}

/**
 * 保存用户信息到存储。
 * @param {Object} result 包含用户信息和token的对象。
 */
export const saveUserInfo = (result) => {
  clearUserInfo()
  setAccessToken(result.token)
  setUserInfo(result?.userInfo)
}
/**
 * 清除用户信息和token。
 */
export const clearUserInfo = () => {
  clearLoginInfo()
  clearAccessToken()
}

export const showErrMessage = (msg = '') => {
  showDialog({
    title: '登录失败',
    message: msg,
    showConfirmButton: false,
  })
}
/**
 * 提供登录功能的工具对象。
 * @returns {Object} 包含initLoad函数的对象。
 */
export const useLogin = () => {
  return {
    initLoad,
  }
}

